import { AxiosRequestConfig, AxiosPromise, AxiosResponse } from '../types/index'
import xhr from './xhr'
import { buildURL } from '../helpers/url'
import { transformRequest, transformResponse } from '../helpers/data'
import { paraseHeaders, flatterHeaders } from '../helpers/header'
import tranform from './transform'

function dispatchRequest(config: AxiosRequestConfig): AxiosPromise {
  processConfig(config)
  return xhr(config).then(res => {
    return transformResponseData(res)
  })
}

/**
 * 处理config
 *
 * @param {AxiosRequestConfig} config
 */
function processConfig(config: AxiosRequestConfig): void {
  // config.headers = processHeaders(config)
  // config.data = processRequestData(config)
  config.data = tranform(config.data, config.headers, config.transformRequest)
  config.url = transformUrl(config)
  config.headers = flatterHeaders(config.headers, config.method!)
}
// function processHeaders(config: AxiosRequestConfig): any {
//   return transformHeaders(config)
// }
// function processRequestData(config: AxiosRequestConfig): any {
//   return transformRequest(config.data)
// }
/**
 *
 * url转换
 * @param {AxiosRequestConfig} config
 * @returns {string}
 */
function transformUrl(config: AxiosRequestConfig): string {
  let { url, params } = config
  return buildURL(url!, params)
}
// function transformHeaders(config: AxiosRequestConfig): any {
//   const { headers = {}, data } = config
//   return paraseHeaders(headers, data)
// }

function transformResponseData(res: AxiosResponse): AxiosResponse {
  // res.data = transformResponse(res.data)
  res.data = tranform(res.data, res.headers, res.config.transformResponse)
  return res
}
export default dispatchRequest
